/**
 * 配置管理模块
 */

const fs = require('fs');
const path = require('path');
const yaml = require('js-yaml');
const logger = require('./logger');

// 默认配置
const DEFAULT_CONFIG = {
  backend: {
    port: 8081,
    jarPath: path.resolve(process.cwd(), 'target/ai-platform-backend-1.0.0.jar'),
    startCommand: 'java',
    startArgs: ['-jar'],
    healthCheckPath: '/actuator/health',
    healthCheckTimeout: 30000 // 30秒
  },
  frontend: {
    port: null, // 使用默认端口
    startCommand: 'npm',
    startArgs: ['run', 'dev'],
    baseDir: process.cwd(),
    healthCheckPath: '/',
    healthCheckTimeout: 20000 // 20秒
  },
  general: {
    waitBetweenServices: 5000 // 5秒
  }
};

/**
 * 加载配置文件
 * @param {Object} cliOptions - 命令行选项
 * @returns {Object} 合并后的配置
 */
exports.loadConfig = async (cliOptions = {}) => {
  try {
    // 构建配置文件路径
    const configPath = path.resolve(process.cwd(), 'mcp-config.yml');
    
    // 加载用户配置文件（如果存在）
    let userConfig = {};
    if (fs.existsSync(configPath)) {
      try {
        const yamlContent = fs.readFileSync(configPath, 'utf8');
        userConfig = yaml.load(yamlContent);
        logger.debug(`已加载用户配置文件: ${configPath}`);
      } catch (err) {
        logger.warn(`解析配置文件失败，使用默认配置: ${err.message}`);
      }
    }
    
    // 合并配置
    const config = deepMerge(DEFAULT_CONFIG, userConfig);
    
    // 应用命令行参数覆盖配置
    if (cliOptions.backendPort) {
      config.backend.port = parseInt(cliOptions.backendPort, 10);
    }
    
    if (cliOptions.frontendPort) {
      config.frontend.port = parseInt(cliOptions.frontendPort, 10);
    }
    
    // 确保jar文件路径正确
    if (!fs.existsSync(config.backend.jarPath)) {
      logger.warn(`后端jar文件不存在: ${config.backend.jarPath}`);
      // 尝试使用相对路径
      const relativeJarPath = path.resolve(process.cwd(), 'target/ai-platform-backend-1.0.0.jar');
      if (fs.existsSync(relativeJarPath)) {
        config.backend.jarPath = relativeJarPath;
        logger.debug(`使用替代jar文件路径: ${config.backend.jarPath}`);
      }
    }
    
    logger.debug('配置加载完成:', JSON.stringify(config, null, 2));
    return config;
  } catch (error) {
    logger.error(`加载配置失败: ${error.message}`);
    // 出错时返回默认配置
    return DEFAULT_CONFIG;
  }
};

/**
 * 深度合并对象
 * @param {Object} target - 目标对象
 * @param {Object} source - 源对象
 * @returns {Object} 合并后的对象
 */
function deepMerge(target, source) {
  const output = { ...target };
  
  if (isObject(target) && isObject(source)) {
    Object.keys(source).forEach(key => {
      if (isObject(source[key])) {
        if (!(key in target)) {
          Object.assign(output, { [key]: source[key] });
        } else {
          output[key] = deepMerge(target[key], source[key]);
        }
      } else {
        Object.assign(output, { [key]: source[key] });
      }
    });
  }
  
  return output;
}

/**
 * 检查是否为对象
 * @param {*} item - 要检查的值
 * @returns {boolean} 是否为对象
 */
function isObject(item) {
  return item && typeof item === 'object' && !Array.isArray(item);
}